package cashpointer.mobile;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import cashpointer.mobile.dao.DaoModel.Countries;
import cashpointer.mobile.dao.DaoModel.Regions;
import cashpointer.mobile.support.Functions;
import cashpointer.mobile.support.NotificationSupportManager;
import cashpointer.mobile.support.PreferencesManager;

public class ListActivity extends Activity {
	
	/**
	 * Opcje menu.
	 */
	static private final int MENU_QUIT = Menu.FIRST;
	static private final int MENU_FIND = Menu.FIRST + 1;
	static private final int MENU_RESTORE = Menu.FIRST + 2;

	/**
     * The columns we are interested in from the database
     */	
	private static final String[] REGION_AND_COUNTRY_PROJECTION = new String[] {
    	Regions._ID, // 0
    	Regions.NAME, // 1
    };
	
	//private static final String LOG_TAG = "ListActivity";

	public void onResume() {
		super.onResume();

    	// Wypelnienie danymi formularza
    	fillFields();
	}
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme_Light);
        setContentView(R.layout.list);

    	// Wypelnienie danymi formularza
    	fillFields();
    }
    
	/**
     * Funkcja budowania menu.
     */
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(2, MENU_FIND, 0, getString(R.string.menu_find_now)).setIcon(R.drawable.menu_find);
        menu.add(1, MENU_RESTORE, 0, getString(R.string.menu_restore)).setIcon(R.drawable.menu_restore);
        menu.add(0, MENU_QUIT, 0, getString(R.string.menu_exit)).setIcon(R.drawable.menu_close);
        return true;
    }

    /**
     * Obsluga zdarzenia wybrania opcji z menu.
     */
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        	case MENU_QUIT: {
        		quit();
        		return true;
        	}
        	case MENU_FIND: {
        		find();
        		return true;
        	}
        	case MENU_RESTORE: {
        		restore();
        		return true;
        	}
        }
	    
        return false;
    }

    /**
     * Funkcja zeruje wartosci formularza do tych wybranych w konfiguracji.
     */
    private void restore() {
    	// Zerowanie zapamietanych danych
		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_CITY_CHOOSE, "");
		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_STREET_CHOOSE, "");
		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_ONLY_MARKED_CASHPOINTERS_CHOOSE, false);
		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, (long)0);
		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, (long)0);
    	
    	// Wypelnienie danymi formularza
    	fillFields();
    }

    /**
     * Funkcja wypelnia pola zapamietamymi danymi a jesli takowych nie ma to kopiuje dane z konfiguracji.
     */
    private void fillFields() {
    	// Sprawdzam, czy sa jakies warunki wyszukiwania dla regionu, jesli nie ma to przypisuje te s konfiguracji
    	if ((long)0 == PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, (long)0)) {
    		long regionChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.REGION_CHOOSE_ID, (long)0);
    		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, regionChooseId);
    	}
    	
    	// Sprawdzam, czy sa jakies warunki wyszukiwania dla country, jesli nie ma to przypisuje te s konfiguracji
    	if ((long)0 == PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, 0)) {
    		long countryChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.COUNTRY_CHOOSE_ID, (long)0);
    		PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, countryChooseId);
    	}
    	    	
    	// Tworze adapter, ktory pobierze dane dla obiektu spinner
		Cursor regionChooseCursor = managedQuery(Regions.CONTENT_URI, REGION_AND_COUNTRY_PROJECTION, null, null, Regions.DEFAULT_SORT_ORDER);			
		SimpleCursorAdapter regionChooseAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, regionChooseCursor, new String[] {Regions.NAME}, new int[] {android.R.id.text1});
		regionChooseAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		
        // Pobieram spinner "Wybierz wojewodztwo" i ustawiam jego wartosc
        Spinner regionChooseSpinner = (Spinner) findViewById(R.id.listRegionChooseSpinner);
        regionChooseSpinner.setAdapter(regionChooseAdapter);
        
        // Pobieram identyfikator zapamietanego wojewodztwa
        long regionChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, (long)0);
        
        // Logi
        //Log.i(LOG_TAG, "Zaczytano z pamieci, LIST_REGION_CHOOSE_ID: " + regionChooseId);
        
        // Ustalam pozycje wybranego wojewodztwa
        int regionChoose = Functions.getRegionPosision((int)regionChooseId, regionChooseCursor);
        
        // Upewniam sie, ze ustalona pozycja nie wykracza poza zakres danych
        if (regionChoose > regionChooseCursor.getCount() - 1) {
        	regionChoose = 0;
        }
        
        // Zaznaczam pozycje pod warunkiem, ze jest cokolewiek na liscie
        if (regionChooseCursor.getCount() > 0) {
        	regionChooseSpinner.setSelection(regionChoose);
        }
        
        // Logi
        //Log.i(LOG_TAG, "Zaczytano z pamieci, regionChoose: " + regionChoose);
        
        // Reagowanie na wybor wojewodztwa - automatyczne zapisanie ustawien
        regionChooseSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
		        long currentRegionChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, (long)0);
				if (currentRegionChooseId != id) {
					// Resetowanie powiatu
					PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, (long)0);
					
					// Zapisanie regionu pozycji i identyfikatora
					PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_REGION_CHOOSE_ID, id);

			        // Logi
			        //Log.i(LOG_TAG, "Zmiana wojewodztwa, LIST_REGION_CHOOSE_ID: " + id);
			        
					// Tworze adapter, ktory pobierze dane dla obiektu countryChooseSpinner
			        String where = Countries.REGION_ID + "=" + id;
					Cursor countryChooseCursor = managedQuery(Countries.CONTENT_URI, REGION_AND_COUNTRY_PROJECTION, where, null, Countries.DEFAULT_SORT_ORDER);			
					SimpleCursorAdapter countryChooseAdapter = new SimpleCursorAdapter(ListActivity.this, android.R.layout.simple_spinner_item, countryChooseCursor, new String[] {Countries.NAME}, new int[] {android.R.id.text1});
					countryChooseAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
					
			        // Pobieram spinner "Wybierz powiat" i ustawiam jego wartosc na 0 poniewaz zostal zresetowany
			        Spinner countryChooseSpinner = (Spinner) findViewById(R.id.listCountryChooseSpinner);
			        countryChooseSpinner.setAdapter(countryChooseAdapter);
			        countryChooseSpinner.setSelection(0); // na pozycji " brak "

			        // Logi
			        //Log.i(LOG_TAG, "Zmiana powiatu, countryChoose: 0");
			        
					// Komunikat
					NotificationSupportManager.showToastNotification(ListActivity.this.getApplicationContext(), getString(R.string.notification_saved));
				}
			}

			public void onNothingSelected(AdapterView<?> arg0) {
			}
        });
  
        // Tworze adapter, ktory pobierze dane dla obiektu spinner
		String where = Countries.REGION_ID + "=" + regionChooseId;
		Cursor countryChooseCursor = managedQuery(Countries.CONTENT_URI, REGION_AND_COUNTRY_PROJECTION, where, null, Countries.DEFAULT_SORT_ORDER);			
		SimpleCursorAdapter countryChooseAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, countryChooseCursor, new String[] {Countries.NAME}, new int[] {android.R.id.text1});
		countryChooseAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        // Pobieram spinner "Wybierz powiat" i ustawiam jego wartosc
        Spinner countryChooseSpinner = (Spinner) findViewById(R.id.listCountryChooseSpinner);
        countryChooseSpinner.setAdapter(countryChooseAdapter);
        
        // Pobieram identyfikator zapamietanego powiatu
        long countryChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, (long)0);

        // Logi
        //Log.i(LOG_TAG, "Zaczytano z pamieci, LIST_COUNTRY_CHOOSE_ID: " + countryChooseId);
        
        // Ustalam pozycje wybranego powiatu
        int countryChoose = Functions.getCountryPosision((int)countryChooseId, countryChooseCursor);

        // Upewniam sie, ze ustalona pozycja nie wykracza poza zakres danych
        if (countryChoose > countryChooseCursor.getCount() - 1) {
        	countryChoose = 0;
        }

        // Zaznaczam pozycje pod warunkiem, ze jest cokolewiek na liscie
        if (countryChooseCursor.getCount() > 0) {
            countryChooseSpinner.setSelection(countryChoose);
        }

        // Logi
        //Log.i(LOG_TAG, "Zaczytano z pamieci, countryChoose: " + countryChoose);
        
        // Reagowanie na wybor powiatu - automatyczne zapisanie ustawien
        countryChooseSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
		        long currentCountryChooseId = PreferencesManager.getLong(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, (long)0);
				if (currentCountryChooseId != id) {
					// Zapisanie country pozycji i identyfikatora
					PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_COUNTRY_CHOOSE_ID, id);

			        // Logi
			        //Log.i(LOG_TAG, "Zmiana powiatu, LIST_COUNTRY_CHOOSE_ID: " + id);
			        
					// Komunikat
					NotificationSupportManager.showToastNotification(ListActivity.this.getApplicationContext(), getString(R.string.notification_saved));
				}
			}

			public void onNothingSelected(AdapterView<?> arg0) {
			}
        });
        
        // Ustawiam zawartosc pola "Podaj miasto"
        String cityChoose = PreferencesManager.getString(getApplicationContext(), PreferencesManager.LIST_CITY_CHOOSE, ""); 
        EditText cityEditText = (EditText)findViewById(R.id.listCityEditText);
        cityEditText.setText(cityChoose);
        
        // Ustawiam zawartosc pola "Podaj ulice"
        String streetChoose = PreferencesManager.getString(getApplicationContext(), PreferencesManager.LIST_STREET_CHOOSE, ""); 
        EditText streetEditText = (EditText)findViewById(R.id.listStreetEditText);
        streetEditText.setText(streetChoose);
        
        // Ustawiam zawartosc pola "Tylko ulubione bankomaty"
        CheckBox onlyMarkedCashpointersCheckBox = (CheckBox)findViewById(R.id.listOnlyMarkedCashpointersCheckBox);
        boolean onlyMarkedCashpointersChoose = PreferencesManager.getBoolean(getApplicationContext(), PreferencesManager.LIST_ONLY_MARKED_CASHPOINTERS_CHOOSE, false);
        onlyMarkedCashpointersCheckBox.setChecked(onlyMarkedCashpointersChoose);
    }

    /**
     * Funkcja zapisuje parametry wyszukiwania a nastepnie wywoluje activity wyszukujace dane
     */
    private void find() {
    	// Zapisuje "Podaj miasto" dane na przyszlosc
        EditText cityEditText = (EditText)findViewById(R.id.listCityEditText);
        String city = cityEditText.getText().toString();
        if (city == null) {
        	city = "";
        }
        PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_CITY_CHOOSE, city);

        // Zapisuje "Podaj ulice" dane na przyszlosc
        EditText streetEditText = (EditText)findViewById(R.id.listStreetEditText);
        String street = streetEditText.getText().toString();
        if (street == null) {
        	street = "";
        }
        PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_STREET_CHOOSE, street);
        
        // Ustawiam zawartosc pola "Tylko ulubione bankomaty"
        CheckBox onlyMarkedCashpointersCheckBox = (CheckBox)findViewById(R.id.listOnlyMarkedCashpointersCheckBox);
        boolean onlyMarkedCashpointersChoose = onlyMarkedCashpointersCheckBox.isChecked();
        PreferencesManager.setPreference(getApplicationContext(), PreferencesManager.LIST_ONLY_MARKED_CASHPOINTERS_CHOOSE, onlyMarkedCashpointersChoose);
    	
    	// Komunikat o szukaniu
    	NotificationSupportManager.showToastNotification(getApplicationContext(), getString(R.string.notification_looking_for));
    	
    	// Wywolanie activity, ktore wyszuka bankomaty i je wyswietli
		startActivity(new Intent(this, FindedCashpointsActivity.class));
	}

	/**
     * Funkcja konczenia aplikacji.
     */
    private void quit() {
    	this.finish();
    }
}